# 防抖

防抖主要用来防止用户快速操作,导致一些不必要的计算。例如如果有人进电梯(触发事件),那电梯将在 10 秒钟后出发(执行事件监听器),这时如果又有人进电梯了(在 10 秒内再次触发该事件),我们又得等 10 秒再出发(重新计时)。

# 示例

假如我们给一个按钮点击事件加上了节流,然后我们以小于间隔时间的频率连续点击按钮,那么按钮回调处理函数只会在点击结束后执行一次。

查看源码
<template>
  <button @click="click">点击我,然后在控制台查看效果</button>
</template>

<script>
import debounce from './debounce'
export default {
  name: 'debounce-demo',
  methods: {
    click: debounce(function () {
      console.log('点击回调')
    }, 1000, true)
  }
}
</script>

# 代码实现

/**
 * 防抖
 * @param {*} fn 回调函数
 * @param {*} delay 间隔大小
 * @param {*} immediate 第一次是否立即回调
 */
export default function debounce(fn, delay, immediate) {
  let timer
  return function (...args) {
    clearTimeout(timer)
    if (immediate && timer === undefined) {
      fn.apply(this, args)
    }
    timer = setTimeout(() => {
      timer = undefined
      fn.apply(this, args)
    }, delay)
  }
}